package models; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.Iterator; import java.util.Map.Entry; import javax.swing.JOptionPane; public class Dictionary implements DictionaryInterface, Container { private HashMap<String, ArrayList<String>> dictionary = new HashMap<String, ArrayList<String>>(); // create an object of Dictionary private static Dictionary instance = new Dictionary(); // make the constructor private so that this class cannot be // instantiated private Dictionary() { } // Get the only object available public static Dictionary getInstance() { return instance; } public void addSynonim(String word, String synonim) { assert isWellFormed(); assert word != null; assert synonim != null; int n = getNumberOfSynonims(word); if (dictionary.containsKey(word)) { dictionary.get(word).add(synonim); } if (dictionary.containsKey(synonim)) { dictionary.get(synonim).add(word); } else { ArrayList<String> s = new ArrayList<String>(); s.add(word); dictionary.put(synonim, s); } assert (getNumberOfSynonims(word) != 0) && (getNumberOfSynonims(word) == n + 1); assert dictionary.get(word).contains(synonim); assert isWellFormed(); } public void deleteSynonim(String word, String synonim) { assert isWellFormed(); assert word != null; assert synonim != null; assert dictionary.get(word).contains(synonim); assert getNumberOfSynonims(word) != 0; int n = getNumberOfSynonims(word); if (dictionary.containsKey(word)) { dictionary.get(word).remove(synonim); } if (dictionary.containsKey(synonim)) { dictionary.get(synonim).remove(word); } assert (getNumberOfSynonims(word) == n - 1); assert !(dictionary.get(word).contains(synonim)); if (dictionary.get(word).isEmpty()) { dictionary.remove(word); } assert isWellFormed(); } public void addWordAndSynonim(String word, ArrayList<String> ss) { assert isWellFormed(); assert word != null; assert ss != null; int n = ss.size(); int m = dictionary.size(); if (dictionary.containsKey(word)) { JOptionPane.showMessageDialog(null, "The word exists in the dictionary! If you want to add a new synonim please" + " press the button Add Synonim!", "Info", JOptionPane.INFORMATION_MESSAGE); return; } else { dictionary.put(word, ss); for (int i = 0; i < ss.size(); i++) { if (dictionary.containsKey(ss.get(i))) { addSynonim(ss.get(i), word); } else { ArrayList<String> s = new ArrayList<String>(); s.add(word); dictionary.put(ss.get(i), s); } } } assert dictionary.size() == m + ss.size() + 1; assert getNumberOfSynonims(word) == n; assert isWellFormed(); } public void deleteWord(String word) { assert isWellFormed(); assert word != null; assert dictionary.containsKey(word); int n = dictionary.size(); if (dictionary.containsKey(word)) { dictionary.remove(word); } String[] keys = new String[dictionary.size()]; keys = dictionary.keySet().toArray(keys); for (String k : keys) { String[] values = new String[dictionary.get(k).size()]; values = dictionary.get(k).toArray(values); for (String s : values) { if (s.equals(word)) { dictionary.get(k).remove(word); if (dictionary.get(k).isEmpty()) { dictionary.remove(k); n--; } } } } assert dictionary.size() == n - 1; assert !(dictionary.containsKey(word)); assert isWellFormed(); } public ArrayList<String> search(String s) { ArrayList<String> result = new ArrayList<>(); s = s.replaceAll("\\?", "[a-zA-Z]"); s = s.replaceAll("\\*", ".*"); Iterator<Entry<String, ArrayList<String>>> iterator = dictionary.entrySet().iterator(); while (iterator.hasNext()) { Entry<String, ArrayList<String>> entry = iterator.next(); if ((entry.getKey()).matches(s)) { result.add(entry.getKey()); } } return result; } public int getNumberOfSynonims(String word) { Iterator<Entry<String, ArrayList<String>>> iterator = dictionary.entrySet().iterator(); while (iterator.hasNext()) { Entry<String, ArrayList<String>> entry = iterator.next(); if (entry.getKey().equals(word)) { return entry.getValue().size(); } } return 0; } public boolean isWellFormed() { ArrayList<String> values = getValues(); String[] keys = new String[dictionary.size()]; keys = dictionary.keySet().toArray(keys); ArrayList<String> myList = new ArrayList<String>(Arrays.asList(keys)); int found = 0; for (String v : values) { if (!(myList.contains(v))) { found = 1; } } if (found == 0) { return true; } else { return false; } } public ArrayList<String> getValues() { ArrayList<String> result = new ArrayList<String>(); Iterator<Entry<String, ArrayList<String>>> iterator = dictionary.entrySet().iterator(); while (iterator.hasNext()) { Entry<String, ArrayList<String>> entry = iterator.next(); for (String s : entry.getValue()) { result.add(s); } } return result; } public HashMap<String, ArrayList<String>> getDictionary() { return dictionary; } public void setDictionary(HashMap<String, ArrayList<String>> dictionary) { this.dictionary = dictionary; } @Override public models.Iterator getIterator(String key) { return (models.Iterator) new SynonymsIterator(key); } private class SynonymsIterator implements models.Iterator { int index; String key; private SynonymsIterator(String key) { this.key = key; } @Override public boolean hasNext() { if (index < dictionary.get(key).size()) { return true; } return false; } @Override public Object next() { Object c = dictionary.get(key).get(index); index++; return c; } } }